#ifndef __MY_HOT__
#define __MY_HOT__
#include "data.hpp"
#include <unistd.h>

extern cloud::DataManager* _data;

namespace cloud{
    class HotManger{
        public:
            HotManger(){
                Config* config = Config::GetInstance();
                _back_dir = config->GetBackDir();
                _pack_dir = config->GetPackDir();
                _pack_suffix = config->GetPackFileSuffix();
                _hot_time = config->GetHotTime();
                FileUtil tmp1(_back_dir);
                FileUtil tmp2(_pack_dir);
                tmp1.CreateDirectory();
                tmp2.CreateDirectory();
            }
            bool RunModule(){
                while(true){
                    // 1.遍历备份文件，获取所有文件名
                    FileUtil fu(_back_dir);
                    std::vector<std::string> arry;
                    fu.ScanDirectory(&arry);
                    // 2.遍历判断文件是否是非热点文件
                    for (auto &a : arry)
                    {
                        if (HotJudge(a) == false)
                        {
                            continue; // 热点文件不需要处理
                        }
                        // 3.获取文件的备份信息
                        BackupInfo bi;
                        if (_data->GetOneByRealPath(a, &bi) == false)
                        {
                            // 现有一个文件存在，但是没有备份信息
                            bi.NewBackupInfo(a); // 设置一个新的备份信息
                        }
                        // 4.对非热点文件进行压缩处理了
                        FileUtil tmp(a);
                        tmp.Compress(bi.pack_path);
                        // 4.删除源文件，修改备份信息
                        tmp.Remove();
                        bi.pack_flag = true;
                        _data->Updata(bi);
                    }
                    usleep(1000);//避免空目录循环遍历
                }
                return true;
            }
        private:
            //非热点文件返回真，热点文件返回假
            bool HotJudge(const std::string& filename){
                FileUtil fu(filename);
                time_t last_time = fu.LastATime();
                time_t cur_time = time(NULL);
                if(cur_time - last_time > _hot_time){
                    return true;
                }
                return false;
            }
        private:
            std::string _back_dir;
            std::string _pack_dir;
            std::string _pack_suffix;
            int _hot_time;
    };
}

#endif